Skip to content

[πŸš€ λ°©νƒˆμΆœ μ˜ˆμ•½ μ™ΈλΆ€ API 연동 3단계] 티뉴 λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€.#699

Merged
picetea44 merged 5 commits into
woowacourse:johnprkfrom
JohnPrk:step5
Jun 28, 2026
Merged

[πŸš€ λ°©νƒˆμΆœ μ˜ˆμ•½ μ™ΈλΆ€ API 연동 3단계] 티뉴 λ―Έμ…˜ μ œμΆœν•©λ‹ˆλ‹€.#699
picetea44 merged 5 commits into
woowacourse:johnprkfrom
JohnPrk:step5

Conversation

@JohnPrk

@JohnPrk JohnPrk commented Jun 26, 2026

Copy link
Copy Markdown

체크 리슀트

  • λ―Έμ…˜μ˜ ν•„μˆ˜ μš”κ΅¬μ‚¬ν•­μ„ λͺ¨λ‘ κ΅¬ν˜„ν–ˆλ‚˜μš”?
  • Gradle testλ₯Ό μ‹€ν–‰ν–ˆμ„ λ•Œ, λͺ¨λ“  ν…ŒμŠ€νŠΈκ°€ μ •μƒμ μœΌλ‘œ ν†΅κ³Όν–ˆλ‚˜μš”?
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ •μƒμ μœΌλ‘œ μ‹€ν–‰λ˜λ‚˜μš”?

베이슀 μ½”λ“œ 선택 체크

  • 이전 λ―Έμ…˜μ˜ λ‚΄ μ½”λ“œμ—μ„œ μ‹œμž‘
  • 이전 λ―Έμ…˜μ˜ νŽ˜μ–΄μ˜ μ½”λ“œμ—μ„œ μ‹œμž‘

μ–΄λ–€ 뢀뢄에 μ§‘μ€‘ν•˜μ—¬ 리뷰해야 ν• κΉŒμš”?

JohnPrk added 5 commits June 26, 2026 16:08
- capacity와 refillPerSecλ₯Ό κ°€μ§„ 토큰 버킷을 μ™ΈλΆ€ μ˜μ‘΄μ„± 없이 μΆ”κ°€
- λ³΄μΆ©λŸ‰μ„ λ§ˆμ§€λ§‰ 보좩 이후 κ²½κ³Ό μ‹œκ°„ Γ— refillPerSec둜 κ³„μ‚°ν•˜κ³  capacityλ₯Ό μƒν•œμœΌλ‘œ μœ μ§€
- tryConsume으둜 토큰을 1κ°œμ”© μ†ŒλΉ„ν•˜κ³  retryAfterSeconds둜 1κ°œκ°€ μ°° λ•ŒκΉŒμ§€ ν•„μš”ν•œ 초λ₯Ό 올림으둜 λ°˜ν™˜
- μ‹œκ°„ μ˜μ‘΄μ„ LongSupplier둜 μ£Όμž…ν•΄ κ°€μ§œ μ‹œκ³„λ‘œ 결정적 ν…ŒμŠ€νŠΈν•˜κ³  synchronized둜 λ™μ‹œμ„± 보μž₯
- HandlerInterceptor둜 preHandleμ—μ„œ tryConsume이 μ‹€νŒ¨ν•˜λ©΄ 컨트둀러λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•Šκ³  429와 Retry-After ν—€λ”λ‘œ 응닡
- /reservations와 /payments κ²½λ‘œμ— 인터셉터λ₯Ό λ“±λ‘ν•˜κ³  μΈλ°”μš΄λ“œ 토큰 버킷을 빈으둜 뢄리
- capacityΒ·refillPerSecλ₯Ό rate-limit.*둜 μ™ΈλΆ€ν™”ν•΄ μ½”λ“œ μˆ˜μ • 없이 κ±°λΆ€ μ‹œμ μ„ μ‘°μ •
- ν† μŠ€ 호좜 RestClient에 ClientHttpRequestInterceptorλ₯Ό 등둝해 429λ©΄ Retry-After 초만큼 λŒ€κΈ° ν›„ μž¬μ‹œλ„
- Retry-Afterκ°€ μ—†μœΌλ©΄ κΈ°λ³Έ κ°„κ²©μœΌλ‘œ ν΄λ°±ν•˜κ³  maxAttemptsλ₯Ό λ„˜μœΌλ©΄ 도메인 μ˜ˆμ™Έλ‘œ μ‹€νŒ¨ν•΄ λ¬΄ν•œ μž¬μ‹œλ„λ₯Ό 차단
- λŒ€κΈ° λ™μž‘μ„ Sleeper둜 μ£Όμž…ν•΄ ν…ŒμŠ€νŠΈμ—μ„œ μ‹€μ œ λŒ€κΈ° 없이 μž¬μ‹œλ„ νšŸμˆ˜μ™€ 간격을 검증
- maxAttemptsΒ·κΈ°λ³Έ 간격을 toss.retry.*둜 μ™ΈλΆ€ν™”
- κ²Œμ΄νŠΈμ›¨μ΄ RestClient에 인터셉터λ₯Ό ν•˜λ‚˜ 더 등둝해 호좜 μ „ tryConsume으둜 토큰을 μ†ŒλΉ„ν•˜κ³  μ—†μœΌλ©΄ μ™ΈλΆ€λ‘œ 보내지 μ•Šκ³  OutboundRateLimitException으둜 κ±°λΆ€
- λ“€μ–΄μ˜€λŠ” μͺ½κ³Ό 같은 TokenBucketRateLimiterλ₯Ό λ°©ν–₯만 λ°”κΏ” μž¬μ‚¬μš©ν•˜κ³  λ‚˜κ°€λŠ” ν•œλ„λ₯Ό outbound-rate-limit.*둜 뢄리 μ™ΈλΆ€ν™”
- κ±°λΆ€ μ‹œ 503κ³Ό Retry-After ν—€λ”λ‘œ μ‘λ‹΅ν•˜λ„λ‘ μ˜ˆμ™Έ ν•Έλ“€λŸ¬μ™€ ProblemType을 μΆ”κ°€
- λ‹€μˆ˜ λ™μ‹œ μš”μ²­μ„ κ°€λ³κ²Œ μƒμ„±ν•˜λ„λ‘ κ³ μ • μŠ€λ ˆλ“œ 풀을 가상 μŠ€λ ˆλ“œ ν’€λ‘œ ꡐ체

@picetea44 picetea44 left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

토큰 버킷을 μ™ΈλΆ€ μ˜μ‘΄μ„± 없이 직접 κ΅¬ν˜„ν•˜μ‹  뢀뢄이 μΈμƒμ μ΄μ˜€μŠ΅λ‹ˆλ‹€!
μ „λ°˜μ μœΌλ‘œ λ―Έμ…˜ 핡심 지점도 잘 μ§šμœΌμ‹  것 κ°™κ³  버킷 μž¬μ‚¬μš© 뢀뢄도 잘 μž‘μœΌμ…¨λ„€μš”

레벨2 λ„ˆλ¬΄ 고생 λ§ŽμœΌμ…¨κ³  λ¨Έμ§€ν•΄λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€

Comment on lines +19 to +22
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(rateLimitInterceptor)
.addPathPatterns("/reservations", "/payments/**");
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

μ˜ˆμ•½ μ—”λ“œν¬μΈνŠΈμ— ν•œλ„λ₯Ό μ μš©ν•˜μ‹€ λ•Œ μ •ν™• 경둜λ₯Ό μ‚¬μš©ν•˜μ‹  것 κ°™μŠ΅λ‹ˆλ‹€.
ν˜Ήμ‹œ μ •ν™•ν•œ '/reservation'μ˜ˆμ•½κ³Ό κ΄€λ ¨ν•œ 경둜만 μ²˜λ¦¬ν•˜μ‹œλ €λŠ” μ˜λ„μ…¨λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€

Comment on lines +60 to +61
.requestInterceptor(tossRetryAfterInterceptor)
.requestInterceptor(tossOutboundRateLimitInterceptor)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ν˜„μž¬ 인터셉터λ₯Ό Retry -> Outbound 순으둜 λ“±λ‘ν•˜μ‹  점에 λŒ€ν•΄μ„œ μˆœμ„œμ— λŒ€ν•œ 선택 지점이 μžˆμœΌμ…¨λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€!

@picetea44 picetea44 merged commit 4a6a3ac into woowacourse:johnprk Jun 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants